package com.graduate.nixingpotterty.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.graduate.nixingpotterty.common.R;
import com.graduate.nixingpotterty.entity.Users;
import com.graduate.nixingpotterty.mapper.UsersMapper;
import com.graduate.nixingpotterty.service.IUsersService;
import com.graduate.nixingpotterty.utils.ValidationUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ZhengHao
 * @since 2025-01-12
 */
@Service
@RequiredArgsConstructor
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUsersService {

    private final UsersMapper usersMapper;
    @Override
    public boolean customAddUser(@RequestBody Users user) {
        return this.save(user);
    }

    @Override
    public boolean customDeleteUserById(Long userId) {
        // 可以在这里添加自定义逻辑
        return this.removeById(userId);
    }

    @Override
    public boolean customUpdateUser(Users user) {
        // 可以在这里添加自定义逻辑
        return this.updateById(user);
    }

    @Override
    public Users customGetUserById(Long userId) {
        // 可以在这里添加自定义逻辑
        return this.getById(userId);
    }

    @Override
    public List<Users> customListUsers() {
        // 可以在这里添加自定义逻辑
        return this.list();
    }

    /**
     * 用户注册方法
     */
    @Override
    public boolean registerUser(@RequestBody Users user) {
        // 验证用户名格式
        if (!ValidationUtils.isUsernameValid(user.getUsername())) {
            R.fail("用户名只能由字母和数字组成");
        }

        // 验证密码长度
        if (!ValidationUtils.isPasswordValid(user.getPasswordHash())) {
            R.fail("密码长度不能小于6个字符");
        }

        // 验证电子邮件格式
        if (!ValidationUtils.isEmailValid(user.getEmail())) {
            R.fail("电子邮件格式不正确");
        }

        // 检查用户名是否已存在
        if (this.getOne(new QueryWrapper<Users>().eq("username", user.getUsername())) != null) {
            R.fail("用户名已存在");
        }

        // 加密用户密码
        String hashedPassword = BCrypt.hashpw(user.getPasswordHash(), BCrypt.gensalt());
        user.setPasswordHash(hashedPassword);

        // 保存新用户
        return this.save(user);
    }

    /**
     * 用户登录方法
     */
    @Override
    public boolean loginUser(String username, String password) {
        // 查找用户
        Users user = this.getOne(new QueryWrapper<Users>().eq("username", username));
        if (user == null) {
            return false; // 用户不存在
        }
        // 验证密码
        return BCrypt.checkpw(password, user.getPasswordHash());
    }
}
